package service.validation;

import org.springframework.validation.Errors;
import service.configuration.IFieldEnumConfig;
import entities.Status;

public class EnumValidator {
	
	/**
	 * Teste si la valeur est correspond aux valeurs spécifiées dans la configuration.
	 * 
	 * @param value la valeur du champs à tester
	 * @param conf la confgiguration du champs de type énumération (enum)
	 * @return true si la valeur est valide, false sinon
	 */
	protected boolean isUnknowValue(String value, IFieldEnumConfig conf) {
		return conf.getValues() != null && ! conf.getValues().contains(value);
	}
	
	/**
	 * Teste la validité de la valeur d'un champs de type énumération (enum).
	 * 
	 * @param value la valeur du champs à tester
	 * @param conf la confgiguration du champs de type énumération (enum)
	 * @return le status du champs SoftError ou Valid
	 */
	public Status validate(String value, IFieldEnumConfig conf) {
		if (conf == null || value == null) {
			return FieldValidator.statusValid;
		}
		if (isUnknowValue(value, conf)) {
			return FieldValidator.statusError;
		}
		return FieldValidator.statusValid;
	}
	
	/**
	 * Teste la validité de la valeur d'un champs de type enumération,
	 * et lie le champs à un message d'erreur en cas d'erreur.
	 * 
	 * @param name le nom du champs, util pour lier un message d'erreur au champs
	 * @param value la valeur du champs à tester
	 * @param conf la confgiguration du champs de type énumération
	 * @param errors mapping permettant de lier erreurs et messages
	 * @return le status du champs SoftError ou Valid
	 */
	public Status validate(String name, String value, IFieldEnumConfig conf, Errors errors) {
			
		if (conf == null || value == null) {
			return FieldValidator.statusValid;
		}
		
		if (isUnknowValue(value, conf)) {
			errors.rejectValue(name, "error.field.unknowValue", conf.getValues().toArray(), "");
			return FieldValidator.statusError;
		}
		
		return FieldValidator.statusValid;
	}
}